// RAP [bm]: no animations
///*******************************************************************************
// * Copyright (c) 2007, 2008 IBM Corporation and others.
// * All rights reserved. This program and the accompanying materials
// * are made available under the terms of the Eclipse Public License v1.0
// * which accompanies this distribution, and is available at
// * http://www.eclipse.org/legal/epl-v10.html
// *
// * Contributors:
// *     IBM Corporation - initial API and implementation
// ******************************************************************************/
//package org.eclipse.ui.internal;
//
//import org.eclipse.core.runtime.IProgressMonitor;
//import org.eclipse.core.runtime.IStatus;
//import org.eclipse.core.runtime.Status;
//import org.eclipse.core.runtime.jobs.Job;
//import org.eclipse.jface.preference.IPreferenceStore;
//import org.eclipse.swt.events.DisposeEvent;
//import org.eclipse.swt.events.DisposeListener;
//import org.eclipse.swt.graphics.Rectangle;
//import org.eclipse.swt.widgets.Display;
//import org.eclipse.swt.widgets.Shell;
//import org.eclipse.ui.IWorkbenchPreferenceConstants;
//import org.eclipse.ui.internal.tweaklets.Animations;
//import org.eclipse.ui.internal.tweaklets.Tweaklets;
//import org.eclipse.ui.internal.util.PrefUtil;
//
///**
// * This job creates an Animation Engine that uses an Animation Feedback to render
// * the animation. To begin the animation, instantiate this
// * object then call schedule().
// * @since 3.3
// *
// */
//public class AnimationEngine extends Job {
//	public static final int TICK_TIMER = 1;
//	public static final int FRAME_COUNT = 2;
//	public static final int unlimitedDuration = -1;
//
//	private boolean enableAnimations;
//	private long startTime;
//	private long curTime;
//	private long prevTime;
//	private int timingStyle = TICK_TIMER;
//	private long frameCount;
//	private long stepCount;
//	private boolean animationCanceled = false;
//	private long sleepAmount;
//
//	private Display display;
//	private AnimationFeedbackBase feedbackRenderer;
//	private int duration;
//
//	public AnimationEngine(AnimationFeedbackBase animationFeedback,
//			int durationIn) {
//		this(animationFeedback, durationIn, 0);
//	}
//
//	/**
//	 * Creates an Animation that will run for the given number of milliseconds.
//	 * 
//	 * @param animationFeedback provides renderStep(), initialize() and jobInit() methods
//	 * @param durationIn number of milliseconds over which the animation will run
//	 * @param sleepAmountIn number of milliseconds to slow/delay the animation
//	 */
//	public AnimationEngine(AnimationFeedbackBase animationFeedback,
//			int durationIn, long sleepAmountIn) {
//		super(WorkbenchMessages.RectangleAnimation_Animating_Rectangle);
//		sleepAmount = sleepAmountIn;
//		feedbackRenderer = animationFeedback;
//		duration = durationIn;
//		
//		// if animations aren't on this is a NO-OP
//		IPreferenceStore preferenceStore = PrefUtil.getAPIPreferenceStore();
//		enableAnimations = preferenceStore
//				.getBoolean(IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS);
//		if (!enableAnimations) {
//			return;
//		}
//
//		animationCanceled = false;
//
//		// Capture parameters
//		display = feedbackRenderer.getAnimationShell().getDisplay();
//		
//		animationFeedback.getAnimationShell().addDisposeListener(new DisposeListener() {
//			public void widgetDisposed(DisposeEvent e) {
//				cancelAnimation();
//			}			
//		});
//		
//		// Don't show the job in monitors
//		setSystem(true);
//
//		// Set it up
//		feedbackRenderer.initialize(this);
//
//		// Set the animation's initial state
//		stepCount = 0;
//		curTime = startTime = System.currentTimeMillis();
//
//	}
//
//	/**
//	 * @return The current renderer
//	 */
//	public AnimationFeedbackBase getFeedback() {
//		return feedbackRenderer;
//	}
//
//	private Runnable animationStep = new Runnable() {
//
//		public void run() {
//			if (animationCanceled)
//				return;
//			
//			// Capture time
//			prevTime = curTime;
//			curTime = System.currentTimeMillis();
//
//			if (isUpdateStep()) {
//				updateDisplay();
//				frameCount++;
//			}
//			stepCount++;
//		}
//
//	};
//
//	protected void updateDisplay() {
//		if (animationCanceled)
//			return;
//		
//		feedbackRenderer.renderStep(this);
//	}
//
//	protected boolean isUpdateStep() {
//		if (duration == unlimitedDuration || timingStyle == FRAME_COUNT) {
//			return true;
//		}
//
//		// Default to 'TICK_TIMER', update when the system timer changes
//		return prevTime != curTime;
//	}
//
//	private boolean done() {
//		return animationCanceled || amount() >= 1.0;
//	}
//
//	public double amount() {
//		if (duration == unlimitedDuration) {
//			return 0;
//		}
//		double amount = 0.0;
//		switch (timingStyle) {
//			case TICK_TIMER:
//				amount = (double) (curTime - startTime) / (double) duration;
//				break;
//	
//			// For testing purposes
//			case FRAME_COUNT:
//				amount = (double) frameCount / (double) duration;
//		}
//
//		if (amount > 1.0)
//			amount = 1.0;
//
//		return amount;
//	}
//
//	protected IStatus run(IProgressMonitor monitor) {
//		// We use preference value to indicate that the animation should be skipped on this platform.
//		if (!enableAnimations) {
//			return Status.OK_STATUS;
//		}
//
//		// We're starting, initialize
//		display.syncExec(new Runnable() {
//			public void run() {
//				// 'jobInit' returns 'false' if it doesn't want to run...
//				if (!animationCanceled)
//					animationCanceled = !feedbackRenderer.jobInit(AnimationEngine.this);
//			}
//		});
//
//		if (animationCanceled)
//			return Status.CANCEL_STATUS;
//		
//		// Only start the animation timer -after- we've initialized
//		curTime = startTime = System.currentTimeMillis();
//
//		while (!done() && !animationCanceled) {
//			display.syncExec(animationStep);
//
//			// Don't pin the CPU
//			try {
//				Thread.sleep(sleepAmount);
//			} catch (InterruptedException e) {
//			}
//		}
//
//		if (animationCanceled)
//			return Status.CANCEL_STATUS;
//
//		// We're done, clean up
//		display.syncExec(new Runnable() {
//			public void run() {
//				feedbackRenderer.dispose();
//			}
//		});
//
//		return Status.OK_STATUS;
//	}
//
//	public void cancelAnimation() {
//		animationCanceled = true;
//		feedbackRenderer.dispose();
//		cancel();
//	}
//
//	public long getFrameCount() {
//		return frameCount;
//	}
//	
//	public static void createTweakedAnimation(Shell shell, int duration, Rectangle start, Rectangle end) {
//		RectangleAnimationFeedbackBase feedback = ((Animations) Tweaklets
//				.get(Animations.KEY)).createFeedback(shell);
//		feedback.addStartRect(start);
//		feedback.addEndRect(end);
//		
//		AnimationEngine animation = new AnimationEngine(feedback, 400);
//		animation.schedule();
//	}
//}
